package hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import entity.*;

/*  El util hace toda la configuracion de hibernate, interactua con el hibernate properties. En este escribo todas las tablas que quiero crear. el hibernate util tiene varias funciones, por ejemplo el session factory, te crea una nueva sesion para tu base de datos (como cuando se hace un log in). y en esa sesion voy a laburar para todo mi sistema y le digo que clases agregar. hay una sola session factory, por que tiene el static final adelante. Pero despues voy a laburar no con session factory sino con sessions, cuando hago algo de hql (ya sea un insert o algo asi) voy a trabajar con la session, pero la primera vez que creas todo se usa la session factory, la cual te devuelve sessions. */

public class HibernateUtil{

/* static: no importa cuantas instancias llames de Hibernate Util el valor va a ser el mismo para todas las instancias. */
/* final: una vez inicializado no se puede modificar el valor nunca mas. Por lo tanto en este caso, vas a poder poder escribir una sola vez el valor para todas las instancias que llames. */


	/* The main responsibility of a Hibernate SessionFactory is to create and manage Sessions. */

	private static final SessionFactory sessionFactory;

	/* Al asignar static, los valores no se podran modificar una vez que las clases sean instanciadas. */

	static{
		try{
			AnnotationConfiguration config = new AnnotationConfiguration();
			config.addAnnotatedClass(entity.EmpleadoEntity.class);
//			config.addAnnotatedClass(bean.Clase2.class);
//			config.addAnnotatedClass(bean.ClaseN.class);

			sessionFactory = config.buildSessionFactory();
		}
		catch (Throwable e){
			System.err.println("Initial SessionFactory creation failed." + e);
			throw new ExceptionInInitializerError(e);
		}
	}

	public static Session getSession()throws HibernateException{
		return sessionFactory.openSession();
	}

	/* The main responsibility of a Hibernate Session is to provide a CRUD interface for mapped classes.*/
	/* CRUD = Create, Read, Update and Delete or the basic operations of any database. */

	public static SessionFactory getSessionFactory(){
		return sessionFactory;
	}
}

